åºæ¬çãªåå®çŸ©ãè¶ ããŸããããæ¡ä»¶åããã³ãã¬ãŒããªãã©ã«ãæååæäœãšãã£ãTypeScriptã®é«åºŠãªæ©èœãç¿åŸããéåžžã«å ç¢ã§ã¿ã€ãã»ãŒããªAPIãæ§ç¯ããŸããããã°ããŒãã«ãªéçºè åãã®å æ¬çãªã¬ã€ãã§ãã
TypeScriptã®æœåšèœåãæå€§éã«åŒãåºãïŒæ¡ä»¶åããã³ãã¬ãŒããªãã©ã«ãé«åºŠãªæååæäœã®åŸ¹åºè§£èª¬
çŸä»£ã®ãœãããŠã§ã¢éçºã®äžçã§ã¯ãTypeScriptã¯JavaScriptã®åçŽãªåãã§ãã«ãŒãšããŠã®åæã®åœ¹å²ãã¯ããã«è¶ ããŠé²åããŸãããããã¯ãåã¬ãã«ããã°ã©ãã³ã°ãšåŒã°ãããã®ã«å¯ŸããæŽç·ŽãããããŒã«ãšãªã£ãŠããŸãããã®ãã©ãã€ã ã«ãããéçºè ã¯åèªäœãæäœããã³ãŒããèšè¿°ããåçã§èªå·±ææžåãããéåžžã«å®å šãªAPIãäœæã§ããŸãããã®é©åœã®äžå¿ã«ã¯ãæ¡ä»¶åããã³ãã¬ãŒããªãã©ã«åãããã³çµã¿èŸŒã¿ã®æååæäœåã®ã¹ã€ãŒããšããã3ã€ã®åŒ·åãªæ©èœã飿ºããŠåäœããŠããŸãã
TypeScriptã¹ãã«ãåäžãããããšèããŠããäžçäžã®éçºè ã«ãšã£ãŠããããã®æŠå¿µãçè§£ããããšã¯ãã¯ãèŽ æ²¢åã§ã¯ãªããã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®ã¬ã€ãã§ã¯ãåºç€ååããå§ããŠããã®çµã¿åããã®åã瀺ãè€éãªå®äžçã®ãã¿ãŒã³ãæ§ç¯ããã培åºçãªè§£èª¬ãè¡ããŸãããã¶ã€ã³ã·ã¹ãã ãã¿ã€ãã»ãŒããªAPIã¯ã©ã€ã¢ã³ãããŸãã¯è€éãªããŒã¿åŠçã©ã€ãã©ãªãæ§ç¯ããå Žåã§ãããããã®æ©èœãç¿åŸããããšã§ãTypeScriptã®èšè¿°æ¹æ³ãæ ¹æ¬çã«å€ãããŸãã
åºç€ïŒæ¡ä»¶åïŒextendsäžé
æŒç®åïŒ
ãã®æ žå¿ã«ãããŠãæ¡ä»¶åã䜿çšãããšãåã®é¢ä¿ãã§ãã¯ã«åºã¥ããŠ2ã€ã®å¯èœãªåã®ãããããéžæã§ããŸããJavaScriptã®äžé
æŒç®åïŒcondition ? valueIfTrue : valueIfFalseïŒã«æ
£ããŠããå Žåã¯ãæ§æãããã«çŽæçã§ããããšã«æ°ä»ãã§ãããã
type Result = SomeType extends OtherType ? TrueType : FalseType;
ããã§ãextendsããŒã¯ãŒãã¯æ¡ä»¶ãšããŠæ©èœããŸããããã¯ãSomeTypeãOtherTypeã«ä»£å
¥å¯èœãã©ããããã§ãã¯ããŸããç°¡åãªäŸã§åè§£ããŠã¿ãŸãããã
åºæ¬çãªäŸïŒåã®ãã§ãã¯
ç¹å®ã®åTãæååã§ããå Žåã¯trueãããã§ãªãå Žåã¯falseã«è§£æ±ºãããåãäœæãããšããŸãããã
type IsString
次ã«ããã®åãæ¬¡ã®ããã«äœ¿çšã§ããŸãã
type A = IsString<"hello">; // type A is true
type B = IsString<123>; // type B is false
ããã¯åºæ¬çãªæ§æèŠçŽ ã§ããããããæ¡ä»¶åã®çã®åã¯ãinferããŒã¯ãŒããšçµã¿åããããšãã«çºæ®ãããŸãã
`infer`ã®åïŒå éšããã®åã®æœåº
inferããŒã¯ãŒãã¯ã²ãŒã ãã§ã³ãžã£ãŒã§ããextendså¥å
ã§æ°ãããžã§ããªãã¯å倿°ã宣èšã§ãããã§ãã¯ããŠããåã®äžéšã广çã«ãã£ããã£ã§ããŸãããã¿ãŒã³ãããã³ã°ããå€ãååŸããåã¬ãã«ã®å€æ°å®£èšãšèããŠãã ããã
å€å
žçãªäŸã¯ãPromiseã«å«ãŸããåãã¢ã³ã©ããããããšã§ãã
type UnwrapPromise
ãããåæããŠã¿ãŸãããã
T extends PromiseïŒããã¯ãTãPromiseã§ãããã©ããããã§ãã¯ããŸããããã§ããå ŽåãTypeScriptã¯æ§é ãç §åããããšããŸããinfer UïŒäžèŽãæåããå ŽåãTypeScriptã¯Promiseã解決ãããåããã£ããã£ããUãšããååã®æ°ããå倿°ã«å ¥ããŸãã? U : TïŒæ¡ä»¶ãçã®å ŽåïŒTãPromiseã ã£ãå ŽåïŒãçµæã®åã¯UïŒã¢ã³ã©ãããããåïŒã«ãªããŸãããã以å€ã®å Žåãçµæã®åã¯å ã®åTã«ãªããŸãã
äœ¿çšæ³ïŒ
type User = { id: number; name: string; };
type UserPromise = Promise
type UnwrappedUser = UnwrapPromise
type UnwrappedNumber = UnwrapPromise
ãã®ãã¿ãŒã³ã¯éåžžã«äžè¬çã§ãããããTypeScriptã«ã¯ãåãååã䜿çšããŠé¢æ°ã®æ»ãå€ã®åãæœåºããããã«å®è£
ãããReturnTypeã®ãããªçµã¿èŸŒã¿ã®ãŠãŒãã£ãªãã£åãå«ãŸããŠããŸãã
åé çæ¡ä»¶åïŒå ±çšäœãšã®é£æº
æ¡ä»¶åã®é åçã§éèŠãªåäœã¯ããã§ãã¯ãããåããçã®ããžã§ããªãã¯åãã©ã¡ãŒã¿ãŒã§ããå Žåã«åé çã«ãªãããšã§ããã€ãŸããå ±çšäœãæž¡ããšãæ¡ä»¶ã¯å ±çšäœã®åã¡ã³ããŒã«åå¥ã«é©çšãããçµæã¯æ°ããå ±çšäœã«åéãããŸãã
åããã®åã®é åã«å€æããåãèããŠã¿ãŸãããã
type ToArray
å
±çšäœãToArrayã«æž¡ããšïŒ
type StrOrNumArray = ToArray
çµæã¯(string | number)[]ã§ã¯ãããŸãããTãçã®åãã©ã¡ãŒã¿ãŒã§ãããããæ¡ä»¶ã忣ãããŸãã
ToArrayã¯string[]ã«ãªããŸãToArrayã¯number[]ã«ãªããŸã
æçµçãªçµæã¯ããããã®åã
ã®çµæã®å
±çšäœã§ãïŒstring[] | number[]ã
ãã®åé
ããããã£ã¯ãå
±çšäœã®ãã£ã«ã¿ãªã³ã°ã«éåžžã«åœ¹ç«ã¡ãŸããããšãã°ãçµã¿èŸŒã¿ã®ExtractãŠãŒãã£ãªãã£åã¯ãããã䜿çšããŠãUã«å²ãåœãŠå¯èœãªå
±çšäœTããã¡ã³ããŒãéžæããŸãã
ãã®åé
çåäœã鲿¢ããå¿
èŠãããå Žåã¯ãextendså¥ã®äž¡åŽã§åãã©ã¡ãŒã¿ãŒãã¿ãã«ã§ã©ããã§ããŸãã
type ToArrayNonDistributive
type StrOrNumArrayUnified = ToArrayNonDistributive
ãã®åŒ·åºãªåºç€ã«åºã¥ããŠãåçãªæåååãæ§ç¯ããæ¹æ³ãæ¢ã£ãŠã¿ãŸãããã
åã¬ãã«ã§ã®åçãªæååã®æ§ç¯ïŒãã³ãã¬ãŒããªãã©ã«å
TypeScript 4.1ã§å°å ¥ããããã³ãã¬ãŒããªãã©ã«åã䜿çšãããšãJavaScriptã®ãã³ãã¬ãŒããªãã©ã«æååã®ãããªåœ¢ç¶ã®åãå®çŸ©ã§ããŸããããã«ãããæ¢åã®æååãªãã©ã«åãé£çµãçµåãããã³çæã§ããŸãã
æ§æã¯ãŸãã«äºæ³ã©ããã§ãã
type World = "World";
type Greeting = `Hello, ${World}!`; // type Greeting is "Hello, World!"
ããã¯åçŽã«èŠãããããããŸãããããã®åã¯ãå ±çšäœããã³ãžã§ããªã¯ã¹ãšçµã¿åãããããšã«ãããŸãã
å ±çšäœãšé å
ãã³ãã¬ãŒããªãã©ã«åã«å ±çšäœãå«ãŸããå Žåããã¹ãŠã®å¯èœãªæååé åãå«ãæ°ããå ±çšäœã«å±éãããŸããããã¯ãé©åã«å®çŸ©ããã宿°ã®ã»ãããçæãã匷åãªæ¹æ³ã§ãã
CSSããŒãžã³ããããã£ã®ã»ãããå®çŸ©ãããšããŸãããã
type Side = "top" | "right" | "bottom" | "left";
type MarginProperty = `margin-${Side}`;
MarginPropertyã®çµæã®åã¯æ¬¡ã®ãšããã§ãïŒ
"margin-top" | "margin-right" | "margin-bottom" | "margin-left"
ããã¯ãç¹å®ã®æåå圢åŒã®ã¿ãèš±å¯ãããŠããã¿ã€ãã»ãŒããªã³ã³ããŒãã³ãããããã£ãŸãã¯é¢æ°åŒæ°ãäœæããã®ã«æé©ã§ãã
ãžã§ããªã¯ã¹ãšã®çµã¿åãã
ãã³ãã¬ãŒããªãã©ã«ã¯ããžã§ããªã¯ã¹ã§äœ¿çšãããšç䟡ãçºæ®ããŸããå ¥åãåºã«æ°ããæååãªãã©ã«åãçæãããã¡ã¯ããªåãäœæã§ããŸãã
type MakeEventListener
type UserListener = MakeEventListener<"user">; // "onUserChange"
type ProductListener = MakeEventListener<"product">; // "onProductChange"
ãã®ãã¿ãŒã³ã¯ãåçã§ã¿ã€ãã»ãŒããªAPIãäœæããããã®éµã§ãããããã`"user"`ã`"User"`ã«å€æŽããŠ`"onUserChange"`ãååŸãããªã©ãæååã®å€§æåãšå°æåã倿Žããå¿ èŠãããå Žåã¯ã©ãã§ãããããããã§ãæååæäœåãç»å ŽããŸãã
ããŒã«ãããïŒçµã¿èŸŒã¿ã®æååæäœå
ãã³ãã¬ãŒããªãã©ã«ãããã«åŒ·åã«ããããã«ãTypeScriptã«ã¯æååãªãã©ã«ãæäœããããã®çµã¿èŸŒã¿åã»ãããçšæãããŠããŸãããããã¯ãŠãŒãã£ãªãã£é¢æ°ã®ãããªãã®ã§ãããåã·ã¹ãã çšã§ãã
倧æåãšå°æåã®ä¿®é£ŸåïŒ`Uppercase`ã`Lowercase`ã`Capitalize`ã`Uncapitalize`
ãããã®4ã€ã®åã¯ãååã瀺ããšããã«æ©èœããŸãïŒ
UppercaseïŒæåååå šäœã倧æåã«å€æããŸããtype LOUD = Uppercase<"hello">; // "HELLO"LowercaseïŒæåååå šäœãå°æåã«å€æããŸããtype quiet = Lowercase<"WORLD">; // "world"CapitalizeïŒæåååã®æåã®æåã倧æåã«å€æããŸããtype Proper = Capitalize<"john">; // "John"UncapitalizeïŒæåååã®æåã®æåãå°æåã«å€æããŸããtype variable = Uncapitalize<"PersonName">; // "personName"
åã®äŸã«æ»ããCapitalizeã䜿çšããŠåŸæ¥ã®ã€ãã³ããã³ãã©ãŒåãçæããããšã§ãæ¹åããŠã¿ãŸãããã
type MakeEventListener
type UserListener = MakeEventListener<"user">; // "onUserChange"
type ProductListener = MakeEventListener<"product">; // "onProductChange"
ããã§ããã¹ãŠã®éšåãæããŸãããããããã©ã®ããã«çµã¿åããããŠè€éãªçŸå®äžçã®åé¡ã解決ããã®ããèŠãŠã¿ãŸãããã
çµ±åïŒé«åºŠãªãã¿ãŒã³ã®ããã«3ã€ãã¹ãŠãçµã¿åããã
ããã¯çè«ãšå®è·µãåºäŒãå Žæã§ããæ¡ä»¶åããã³ãã¬ãŒããªãã©ã«ãããã³æååæäœãçµã¿åãããããšã§ãéåžžã«æŽç·Žãããå®å šãªåå®çŸ©ãæ§ç¯ã§ããŸãã
ãã¿ãŒã³1ïŒå®å šã«ã¿ã€ãã»ãŒããªã€ãã³ããšããã¿ãŒ
ç®æšïŒ on()ãoff()ãããã³emit()ã®ãããªã¡ãœãããæã€æ±çšçãªEventEmitterã¯ã©ã¹ãäœæããå®å
šã«ã¿ã€ãã»ãŒãã«ããŸããããã¯ã次ã®ããšãæå³ããŸãã
- ã¡ãœããã«æž¡ãããã€ãã³ãåã¯ãæå¹ãªã€ãã³ãã§ããå¿ èŠããããŸãã
emit()ã«æž¡ããããã€ããŒãã¯ããã®ã€ãã³ãã«å®çŸ©ãããåãšäžèŽããå¿ èŠããããŸããon()ã«æž¡ãããã³ãŒã«ããã¯é¢æ°ã¯ããã®ã€ãã³ãã®æ£ãããã€ããŒãåãåãå ¥ããå¿ èŠããããŸãã
ãŸããã€ãã³ãåãããã€ããŒãåãžã®ããããå®çŸ©ããŸãïŒ
interface EventMap {
"user:created": { userId: number; name: string; };
"user:deleted": { userId: number; };
"product:added": { productId: string; price: number; };
}
次ã«ããžã§ããªãã¯EventEmitterã¯ã©ã¹ãæ§ç¯ã§ããŸããEventMapæ§é ãæ¡åŒµããå¿
èŠããããžã§ããªãã¯ãã©ã¡ãŒã¿ãŒEventsã䜿çšããŸãã
class TypedEventEmitter
private listeners: { [K in keyof Events]?: ((payload: Events[K]) => void)[] } = {};
// `on`ã¡ãœããã¯ãEventsãããã®ããŒã§ãããžã§ããªãã¯`K`ã䜿çšããŸã
on
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event]?.push(callback);
}
// `emit`ã¡ãœããã¯ããã€ããŒããã€ãã³ãã®åãšäžèŽããããšã確èªããŸã
emit
this.listeners[event]?.forEach(callback => callback(payload));
}
}
ã€ã³ã¹ã¿ã³ã¹åããŠäœ¿çšããŠã¿ãŸãããïŒ
const appEvents = new TypedEventEmitter
// ããã¯ã¿ã€ãã»ãŒãã§ãããã€ããŒãã¯{ userId: number; name: string; }ãšããŠæ£ããæšè«ãããŸã
appEvents.on("user:created", (payload) => {
console.log(`User created: ${payload.name} (ID: ${payload.userId})`);
});
// TypeScriptã¯ããã§ãšã©ãŒãè¿ããŸãã"user:updated"ãEventMapã®ããŒã§ã¯ãªãããã§ã
// appEvents.on("user:updated", () => {}); // Error!
// TypeScriptã¯ããã§ãšã©ãŒãè¿ããŸãããã€ããŒãã«'name'ããããã£ããªãããã§ã
// appEvents.emit("user:created", { userId: 123 }); // Error!
ãã®ãã¿ãŒã³ã¯ãåŸæ¥éåžžã«åçã§ãšã©ãŒãçºçããããã¢ããªã±ãŒã·ã§ã³ã®éšåã«ã³ã³ãã€ã«æã®å®å šæ§ãæäŸããŸãã
ãã¿ãŒã³2ïŒãã¹ãããããªããžã§ã¯ãã®ã¿ã€ãã»ãŒããªãã¹ã¢ã¯ã»ã¹
ç®æšïŒ ããã衚èšã®æååãã¹PïŒäŸïŒ"user.address.city"ïŒã䜿çšããŠããã¹ãããããªããžã§ã¯ãTã®å€ã®åãæ±ºå®ã§ãããŠãŒãã£ãªãã£åPathValueãäœæããŸãã
ããã¯ãååž°çæ¡ä»¶åã瀺ãéåžžã«é«åºŠãªãã¿ãŒã³ã§ãã
ãããå®è£ ã§ããããããåè§£ããŸãïŒ
type PathValue
? Key extends keyof T
? PathValue
: never
: P extends keyof T
? T[P]
: never;
äŸïŒPathValueã䜿çšããŠãã®ããžãã¯ããã¬ãŒã¹ããŠã¿ãŸãããã
- æåã®åŒã³åºãïŒ
Pã¯"a.b.c"ã§ããããã¯ããã³ãã¬ãŒããªãã©ã«`${infer Key}.${infer Rest}`ãšäžèŽããŸãã Keyã¯"a"ãšããŠæšè«ãããŸããRestã¯"b.c"ãšããŠæšè«ãããŸãã- æåã®ååž°ïŒ åã¯ã
"a"ãMyObjectã®ããŒã§ãããã©ããããã§ãã¯ããŸããã¯ãã®å ŽåãPathValueãååž°çã«åŒã³åºããŸãã - 2åç®ã®ååž°ïŒ ä»ã
Pã¯"b.c"ã§ãããã³ãã¬ãŒããªãã©ã«ãšåã³äžèŽããŸãã Keyã¯"b"ãšããŠæšè«ãããŸããRestã¯"c"ãšããŠæšè«ãããŸãã- åã¯ã
"b"ãMyObject["a"]ã®ããŒã§ãããã©ããããã§ãã¯ããPathValueãååž°çã«åŒã³åºããŸãã - ããŒã¹ã±ãŒã¹ïŒ æåŸã«ã
Pã¯"c"ã§ããããã¯`${infer Key}.${infer Rest}`ãšäžèŽããŸãããåããžãã¯ã¯ã2çªç®ã®æ¡ä»¶ã«ãã©ãŒã«ã¹ã«ãŒããŸãïŒP extends keyof T ? T[P] : neverã - åã¯ã
"c"ãMyObject["a"]["b"]ã®ããŒã§ãããã©ããããã§ãã¯ããŸããã¯ãã®å Žåãçµæã¯MyObject["a"]["b"]["c"]ã§ããããã§ãªãå Žåãneverã§ãã
ãã«ããŒé¢æ°ã§ã®äœ¿çšæ³ïŒ
declare function get
const myObject = {
user: {
name: "Alice",
address: {
city: "Wonderland",
zip: 12345
}
}
};
const city = get(myObject, "user.address.city"); // const city: string
const zip = get(myObject, "user.address.zip"); // const zip: number
const invalid = get(myObject, "user.email"); // const invalid: never
ãã®åŒ·åãªåã¯ããã¹ã®ã¿ã€ããã¹ã«ããã©ã³ã¿ã€ã ãšã©ãŒãé²ããè€éãªAPIå¿çãåŠçããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§å ±éã®èª²é¡ã§ãããæ·±ããã¹ããããããŒã¿æ§é ã«æé©ãªåæšè«ãæäŸããŸãã
ãã¹ããã©ã¯ãã£ã¹ãšããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
匷åãªããŒã«ãšåæ§ã«ããããã®æ©èœãè³¢ã䜿çšããããšãéèŠã§ãã
- èªã¿ããããåªå ããïŒ è€éãªåã¯ããã«èªã¿ã«ãããªãå¯èœæ§ããããŸããããããããå°ãããé©åã«åœåããããã«ããŒåã«åå²ããŸããè€éãªã©ã³ã¿ã€ã ã³ãŒããšåãããã«ãã³ã¡ã³ãã䜿çšããŠããžãã¯ã説æããŸãã
- `never`åãçè§£ããïŒ
neveråã¯ãæ¡ä»¶åã®ãšã©ãŒã¹ããŒããåŠçããå ±çšäœããã£ã«ã¿ãªã³ã°ããããã®äž»èŠãªããŒã«ã§ããããã¯ãçºçããªãã¯ãã®ç¶æ ã衚ããŸãã - ååž°å¶éã«æ³šæããïŒ TypeScriptã«ã¯ãåã®ã€ã³ã¹ã¿ã³ã¹åã®å垰深床å¶éããããŸããåãæ·±ãããããç¡éã«ååž°ããããããšãã³ã³ãã€ã©ãŒã¯ãšã©ãŒãè¿ããŸããååž°åã«æç¢ºãªããŒã¹ã±ãŒã¹ãããããšã確èªããŠãã ããã
- IDEã®ããã©ãŒãã³ã¹ãç£èŠããïŒ éåžžã«è€éãªåã¯ãTypeScriptèšèªãµãŒããŒã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžãããšãã£ã¿ãŒã§ã®èªåè£å®ãšåãã§ãã¯ãé ããªãããšããããŸããé床äœäžãçºçããå Žåã¯ãè€éãªåãç°¡ç¥åãŸãã¯åå²ã§ãããã©ããã確èªããŠãã ããã
- ãã€åæ¢ããããç¥ãïŒ ãããã®æ©èœã¯ãåå®å šæ§ãšéçºè ãšã¯ã¹ããªãšã³ã¹ã®è€éãªåé¡ã解決ããããã®ãã®ã§ããåçŽãªåãéå°ã«èšèšããããã«äœ¿çšããªãã§ãã ãããç®æšã¯ãäžèŠãªè€éãã远å ããã®ã§ã¯ãªããæçããšå®å šæ§ãé«ããããšã§ãã
çµè«
æ¡ä»¶åããã³ãã¬ãŒããªãã©ã«ãããã³æååæäœåã¯ãåãªãå€ç«ããæ©èœã§ã¯ãããŸããããããã¯ãåã¬ãã«ã§é«åºŠãªããžãã¯ãå®è¡ããããã®ç·å¯ã«çµ±åãããã·ã¹ãã ã§ããããã«ãããåçŽãªã¢ãããŒã·ã§ã³ãè¶ ããŠãç¬èªã®æ§é ãšå¶çŽãæ·±ãèªèããŠããã·ã¹ãã ãæ§ç¯ã§ããŸãã
ãã®ããªãªãç¿åŸããããšã§ã次ã®ããšãã§ããŸãã
- èªå·±ææžåAPIã®äœæïŒ åèªäœãããã¥ã¡ã³ãã«ãªããéçºè ãæ£ãã䜿çšããããã«å°ããŸãã
- ãã°ã®ã¯ã©ã¹å šäœãæé€ããïŒ åãšã©ãŒã¯ã³ã³ãã€ã«æã«ãã£ãããããæ¬çªç°å¢ã®ãŠãŒã¶ãŒã«ãã£ãŠãã£ãããããããšã¯ãããŸããã
- éçºè ãšã¯ã¹ããªãšã³ã¹ã®åäžïŒ ã³ãŒãããŒã¹ã®æãåçãªéšåã§ããè±å¯ãªèªåè£å®ãšã€ã³ã©ã€ã³ãšã©ãŒã¡ãã»ãŒãžããæ¥œãã¿ãã ããã
ãããã®é«åºŠãªæ©èœãæ¡çšããããšã§ãTypeScriptã¯å®å šãããããéçºã«ããã匷åãªããŒãããŒã«å€ãããŸããããã«ãããè€éãªããžãã¹ããžãã¯ãšäžå€æ¡ä»¶ãåã·ã¹ãã ã«çŽæ¥ãšã³ã³ãŒãããã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠããå ç¢ã§ãä¿å®å¯èœã§ãã¹ã±ãŒã©ãã«ã«ãªãããã«ããããšãã§ããŸãã